home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 10
/
FM Towns Free Software Collection 10.iso
/
ms_dos
/
tool
/
conhlp03
/
progsort.bat
< prev
next >
Wrap
DOS Batch File
|
1995-01-22
|
9KB
|
337 lines
rem progsort.bat
rem フリコレの作品名をソート [keyword]パターン付き
rem 必要なもの ()内は置き換え可
rem (jg)awk.exe sed.exe sort.awk(sort.exe)
rem lha.exe fswidx.lzh : [5-9].idx(helper.idx を リネームしてフリーズ)
rem usage : progsort file -- 必要ファイルの分離のみ
rem progsort init [idx].. -- keyw.cfg を 消して再作成
rem progsort - [idx].. -- keyw.cfg にもとづいて作成
rem [idx].. -- 5,6 7 のように spase または ',' で分けて記述
rem 記述無ければ 5-9 が 対象
rem sort.awk がないときには、 set sort=sort などのように設定
if "%1" == "" goto pshelp
if "%1" == "file" goto progsortend
: 内蔵ファイルを カレントデレクトリに展開
awk "/^#f /{f=$2;next} /^$/{f=0} f{print>f}" %0.bat
if exist sort.awk set sort=awk -f sort.awk
if not "%sort%" == "" goto sc
rem ソートできません
goto progsortend
:sc
if exist progsort.txt del progsort.txt
if "%1" == "init" del keyw.cfg
set idx=%2
:loop
shift
if "%2" == "" goto start
set idx=%idx%,%2
goto loop
:start
rem ディフォルトの 対象となる ファイルを書き込む
if "%idx%" == "" set idx=5,6,7,8,9
if exist keyw.cfg goto s
for %%x in (%idx%) do c:command /c keyw %%x
: type keyw.txt
awk -f keyw.awk keyw.txt > keyw.cfg
del keyw.txt
type keyw.cfg
: pause
:s
for %%x in (%idx%) do c:command /c pidx %%x
: awk -f keyco.awk -f pidx.awk *.idx > progsort.txt
: ドライブに余裕があれば [5-9].idx を カレントディレクトリにおいて
: 上の行と置き換え
%sort% < progsort.txt > p
awk -f nfch.awk p > progsort.txt
: awk "{printf\"%%1.1s %%4d\",$NF,$(NF-1);for(i=1;i<(NF-1);i++)printf\" %%s\",$i;print\"\" }" p > progsort.txt
: nfch.awk と同等
del p.
awk '{l[$NF]++}END{for(i in l)print i,l[i]}' progsort.txt | awk -f keyco.awk -f keydeprt.awk > keywpat.txt
goto progsortend
--- ここから 必要ファイル
#f keyw.bat
if not exist %1.idx lha e fswidx %1.idx
sed '1i#%1;s/^KEYWORD: +/# /;s/ +$//;/^$/q' %1.idx >> keyw.txt
: awk 'BEGIN{ print "#"%1} {sub(/^KEYWORD: +/,"# ");sub(/ *$/,"");print $0} /^$/{exit}' %1.idx >> keyw.txt
: 上の行と同じ sed.exe が いらない
if exist fswidx.lzh del %1.idx
#f pidx.bat
if not exist %1.idx lha e fswidx %1.idx
awk -f keyco.awk -f pidx.awk %1.idx >> progsort.txt
if exist fswidx.lzh del %1.idx
#f m.bat
:start
if not "%1" == "%r%" goto sr
echo FSW: %1 %2>> midx.txt
sed -n '%2,/^$/p' %1.idx >> midx.txt
shift
shift
if "%1" == "" goto end
goto start
:sr
if not exist fswidx.lzh goto ss
if exist %r%.idx del %r%.idx
lha e fswidx %1.idx
:ss
set r=%1
goto start
:end
if exist fswidx.lzh del %r%.idx
set r=
type midx.txt
#f search.bat
echo off
if "%1" == "v" set v=1
: vi keyw.cfg
awk -v v=%v% -f keyco.awk -f ksearch.awk progsort.txt > search.txt
echo cursol on v
: miel -g search.txt
type search.txt
#f keyw.awk
{ print }
/^# /{
c = split($0,m," +")
for( j = 2 ; j <= c ; j++ ){
if( m[j] in b ) ;
else{
b[ a[++i] = m[j] ]
}
}
}
END{
for( j = 1 ; j <= i ; j++) print a[j]
}
#f pidx.awk
FNR == 1 ,/^$/{ next }
/^PRO/{
sub(/^PROGRAM *: +/,"")
p = $0
l = FNR
}
#/^KEY/ && /ツール/ && /データ/ && /TOWNS-OS/{
# 最初から こうしておけば 処理は速いだろうな
/^KEY/{
for( j = 2 ; j <= NF ; j++ ){
k[$j]
}
}
#/^MAK/{
# sub(/^MAKE *: +/,"")
# m = $0
#}
/^$/ && p != "" {
put()
}
END{
if( p != "" ){ put() }
}
function put( j,f ){
f = ""
for( j = 1 ; j <= kmax ; j++ ){
f = ( ( ak[j] in k ) ? "1" : "0" ) f
}
# print p,m,kco(f),l,FILENAME
print p,kco(f),l,FILENAME
p = ""
for( j in k ) delete k[j]
}
#f keyco.awk
BEGIN{
while( ( getline l < "keyw.cfg" ) > 0 ){
if( l ~/^#/ || l ~/^$/ ) continue
split(l,k,"[ \t]+")
ak[++kmax] = k[1]
as[ kmax] = k[2]
}
for( l in k ) delete k[l]
nn = 7 # bit 数
l = 48 + 64 # 6 bit - 64 : 7 bit - 128
l = 224 # '0' 以降の 全ての半角文字
for( j = 48 ; j < l ; j++ ){
if( 127 <= j && j < 161 ) continue
ss = ss sprintf("%c",j)
}
# print ss
}
function kco( b ,a,i,r ){ # 2 進数文字列 --> $code
sub(/^0*/,"",b)
while( ( length(b) % nn ) != 0 ) b = "0" b
r = ""
a = 0
for( i = 1 ; i <= length(b) ; i++ ){
a = a * 2 + substr(b,i,1)
if( ( i % nn ) == 0 ){
r = r substr(ss,a+1,1)
a = 0
}
}
sub(/^0+/,"",r)
return ( "$" r )
}
function kde( o ,r,i,j,a ){ # $code --> 2 進数文字列
if( substr(o,1,1) != "$" ) return "err"
r = ""
for( i = length(o) ; i >= 2 ; i-- ){
a = index(ss,substr(o,i,1)) - 1
if( a < 0 ) return "err"
for( j = 0 ; j < nn ; j++ ){
r = ( ( a % 2 ) == 0 ? "0" : "1" ) r
a = int( a / 2 )
}
}
return r
}
#f keydeprt.awk
# awk -f keyco.awk -f keydeprt.awk [file]
# echo $code | awk -f keyco.awk -f keydeprt.awk
# [keyword] パターン $code を 展開表示
{
if( $2 ~/[0-9]/ ){
printf "%-6s%4d : ", $1, $2
}else{
printf "%-6s : ", $1
}
f = kde($1)
for( i = 1 ; i <= length(f) ; i++ ){
if( substr(f,length(f)-i+1,1) == "1" ) printf "%-11s",ak[i]
}
print ""
}
#f ksearch.awk
# awk [-v v=1] -f keyco.awk -f ksearch.awk [file|progsort.txt]
# ちょっと(...だいぶん)時間がかかるので覚悟
BEGIN{
for( i in as ) if( as[i] == "*" ) b++
usesc["-"] = 1 # not 選択 : red
usesc["+"] = 3 # or 選択 : yellow
usesc["*"] = 6 # and 選択 : skyblue
usesc[""] = 4 # nop : blue
v += 0
cr[0] = "@"
cr[1] = "\n"
printf "\33[1v" > "con" # cursol off
}
{
f = kde($NF)
c = d = 0
for( i = 1 ; i <= length(f) ; i++ ){
if( substr(f,length(f)-i+1,1) != "1" ) continue
if( v ) printf "\33[3%dm[%s]\33[m", usesc[as[i]],ak[i] > "con"
if( as[i] == "-" ){
printf cr[v] > "con"
next
}
if( as[i] == "*" ) c++
if( as[i] == "+" ) d++
}
printf cr[v] > "con"
if( b != 0 && b == c || d != 0 ) print
}
END{
printf "\a\33[0v" > "con" # cursol on & bell
}
#f nfch.awk
{
printf "%1.1s %4d",$NF,$(NF-1)
for( i = 1 ; i < (NF-1) ; i++ ){
printf " %s",$i
}
print ""
}
--- ここまで
note :
◇progsort.bat
progsort.txt keyw.cfg keywpat.txt の作成と関連ファイルの分離だけの
ものです。本体は、とても小さいです。
カレントディレクトリに置かなくても、フルパスで呼び出せば、十分です。
作品名だけの場合なら、
awk '/^PROG/{f=FILENAME;printf"%1.1s %4d %s\n",f,FNR,$0}' *.idx
で、すんでしまうのに・・・
◇[keyword]パターン $code について
キーワードの設定を2進化し、128進数表現で、表らわしています。
コード・デコードともに keyw.cfgを使用しています。progsort.txtと一
緒に作成されたもので、 keyw.cfgのキーワードの順序と数が、変更された
ときは、正しく変換されません。
echo $code | awk -f keywco.awk -f keywdeprt.txt
などで、表示できます。
◇search.bat [v]
キーワードでの作品の絞り込みができます。
keyw.cfg のキーワードの後ろに、スペースまたはタブで、区切って次の
文字を書き込みます。'#' で始まる行と空行は、無視されます。
+ : or 選択 設定されていれば、選択されます。
* : and 選択 設定の数と '*' の数が一致すると選択されます。
- : not 選択 '*','+' にかかわらず選択されません。
時間はかかりますが、かなり複雑な条件もできます。
search.txt に結果が返ります。
v オプションで検索途中のキーワードがみれます。
◇m.bat [idx],[line] ..
progsort.txt,search.txt の行頭にあるのが、vol no. 次が、helper.idx
での行数です。
m 5,222 7,3333 8,222 9,1022
などのようにすれば、それぞれの情報が、midx.txt に格納されます。
◇sort.awk
オーム社の本に掲載のマージソートをちょっと改造して、使用しているの
で、同等のもの、もしくは、 sort.exe などを用意のうえ、
set sort=sort [opt]
のように設定してから、実行してください。
これは、新たに progsort.txt を作るときにだけ、必要です。
◇fswidx.lzh [5-9].idx
フリコレの helper.idx をそれぞれリネームして、まとめて冷凍していま
す。つまり、用意して下さい。
5 - 9 のときは、ディスク空容量 450KBぐらい必要。
ディスクに余裕があれば、[5-9].idx をそのままカレントディレクトリに
おいてください。すべてカレントディレクトリに置くとすれば、1MBぐら
いの空き容量が必要かと・・・
環境のためのメモリに注意。
このように、バッチファイル中にバッチファイルを書くときには、ラベル
に注意しないと誤動作の可能性があるので、注意すること。
この展開例では、空行をファイル終了の印にしているので、可読性などの
ためにあきを入れるためには、 rem 文または、 ':',' ' の行であける。
細かいファイルをひとつのファイルにまとめ、管理しやすくなる。また、
必要なときにだけ、展開するので、占有クラスタを少なくすることになる。
バッチファイル中に rem 文でなくドキュメントを書く人は、他にはいな
いんだろうな。
calo / pec01662@niftyserve
:pshelp
type %0.bat
:progsortend
set idx=
set sort=